<?php
/**
 * 系统钻石补扣日志处理
 * Created by PhpStorm.
 * Keter
 * 2016/8/1
 * @守护进程
 */
class DiamondLogHandler extends ScriptBase
{
    /**
     * 游戏服保存的牌局日志KEY
     */
    const LOG_NAME = 'diamondLog';

    /**
     * 出错备份
     */
    const QUEEN_BACKUP_NAME = 'diamondLogBackup';

    /**
     * 当前脚本暂停标志
     * 同类结果为TRUE时则暂停和停止，如1
     */
    const SUSPEND_TAG = 'DIAMOND_LOG_HANDLER_SUSPEND'; //暂停

    /**
     * 停止脚本标志
     */
    const STOP_TAG = 'DIAMOND_LOG_HANDLER_STOP'; //停止

    public $userStatsRedis;

    /**
     * 逻辑代码
     */
    public function logic()
    {
        set_time_limit(0);

        while (true) {
            try {
                sleep(1);

                // 连接redis
                $this->userStatsRedis = $this->redis('user_stats');

                //停止脚本循环
                if ($this->userStatsRedis->get(self::STOP_TAG)) {
                    break;
                }

                //暂停脚本循环
                if ($this->userStatsRedis->get(self::SUSPEND_TAG)) {
                    continue;
                }

                //执行脚本
                $element = $this->userStatsRedis->lrange(self::LOG_NAME, -1, -1);

                if ($element) {
                    $result      = $this->logHandler($element);
                    $lastElement = $this->userStatsRedis->rpop(self::LOG_NAME);
                    /**
                     * 如果没有处理成功，则放入备份队列
                     */
                    if ($lastElement && !$result) {
                        $this->userStatsRedis->lpush(self::QUEEN_BACKUP_NAME, $lastElement);
                    }
                }

                // 断开redis
                $this->deinitRedis('user_stats');
            } catch (Exception $e) {
                $this->e($e->getMessage());
            }
        }
    }

    /**
     * 执行脚本
     * @param $redis
     */
    public function logHandler($result)
    {
        if ($result) {
            $result = reset($result);
            $str = $result;
            if  ($str) {
                $data = json_decode($str, true);
                $this->userStatsRedis->multi();
                $result = $this->save2db($data);
                if ($result) {
                    $this->userStatsRedis->exec();
                    return true;
                } else {
                    $this->userStatsRedis->discard();
                    return false;
                }
            }
        }
    }

    /**
     * 保存日志数据
     * @param $data
     * @return array
     */
    public function save2db($data)
    {
        $diamondLog = new DiamondLogQueen();
        $diamondLog->isRedisLog(false);
        $diamondLog->setTableName();
        return $diamondLog->saveLog($data);
    }
}
?>